﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ImageSkiaSharp
{
    public static class FileHelp
    {
        /// <summary>
        /// 读取文件内容
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        /// <exception cref="FileNotFoundException"></exception>
        public static string ReadFile(string filePath)
        {
            // 检查文件是否存在
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException("文件不存在");
            }
            // 读取文件内容并返回
            return File.ReadAllText(filePath);
        }

        // 写入内容到文件
        public static void WriteFile(string filePath, string content)
        {
            // 写入内容到文件（如果文件不存在则创建）
            File.WriteAllText(filePath, content);
        }

        // 重命名文件
        public static void RenameFile(string filePath, string newFileName)
        {
            // 获取文件目录
            string directory = Path.GetDirectoryName(filePath);
            // 构建新的文件路径
            string newFilePath = Path.Combine(directory, newFileName);

            // 检查文件是否存在
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException("文件不存在");
            }

            // 检查新文件名是否已存在
            if (File.Exists(newFilePath))
            {
                throw new IOException("新文件名已存在");
            }

            // 重命名文件
            File.Move(filePath, newFilePath);
        }

        // 移动文件
        public static void MoveFile(string sourceFilePath, string destinationFilePath)
        {
            // 检查源文件是否存在
            if (!File.Exists(sourceFilePath))
            {
                throw new FileNotFoundException("源文件不存在");
            }

            // 检查目标文件是否已存在
            if (File.Exists(destinationFilePath))
            {
                throw new IOException("目标文件已存在");
            }

            // 移动文件
            File.Move(sourceFilePath, destinationFilePath);
        }

        // 复制文件
        public static void CopyFile(string sourceFilePath, string destinationFilePath)
        {
            // 检查源文件是否存在
            if (!File.Exists(sourceFilePath))
            {
                throw new FileNotFoundException("源文件不存在");
            }

            // 检查目标文件是否已存在
            if (File.Exists(destinationFilePath))
            {
                throw new IOException("目标文件已存在");
            }

            // 复制文件
            File.Copy(sourceFilePath, destinationFilePath);
        }

        // 修改文件属性
        public static void ModifyFileAttributes(string filePath, FileAttributes attributes)
        {
            // 检查文件是否存在
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException("文件不存在");
            }

            // 修改文件属性
            File.SetAttributes(filePath, attributes);
        }

        // 读取文件夹内容
        public static List<string> ReadDirectory(string directoryPath)
        {
            // 检查文件夹是否存在
            if (!Directory.Exists(directoryPath))
            {
                throw new DirectoryNotFoundException("文件夹不存在");
            }

            // 获取文件夹中的所有文件和子文件夹
            var entries = Directory.GetFileSystemEntries(directoryPath).ToList();
            return entries;
        }

        /// <summary>
        /// 遍历文件夹
        /// </summary>
        /// <param name="directoryPath"></param>
        /// <returns></returns>
        /// <exception cref="DirectoryNotFoundException"></exception>
        public static List<string> TraverseDirectory(string directoryPath)
        {
            // 检查文件夹是否存在
            if (!Directory.Exists(directoryPath))
            {
                throw new DirectoryNotFoundException("文件夹不存在");
            }

            // 获取文件夹中的所有文件和子文件夹，包括子文件夹中的内容
            var files = Directory.GetFiles(directoryPath, "*.*", SearchOption.AllDirectories).ToList();
            return files;
        }

        // 获取文件夹大小
        public static long GetDirectorySize(string directoryPath)
        {
            // 检查文件夹是否存在
            if (!Directory.Exists(directoryPath))
            {
                throw new DirectoryNotFoundException("文件夹不存在");
            }

            // 获取文件夹中所有文件的大小
            var files = Directory.GetFiles(directoryPath, "*.*", SearchOption.AllDirectories);
            long size = files.Sum(file => new FileInfo(file).Length);
            return size;
        }

        // 删除文件
        public static void DeleteFile(string filePath)
        {
            // 检查文件是否存在
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException("文件不存在");
            }

            // 删除文件
            File.Delete(filePath);
        }

        // 创建文件夹
        public static void CreateDirectory(string directoryPath)
        {
            // 检查文件夹是否存在
            if (Directory.Exists(directoryPath))
            {
                return;
                //throw new IOException("文件夹已存在");
            }

            // 创建文件夹
            Directory.CreateDirectory(directoryPath);
        }

        // 删除文件夹
        public static void DeleteDirectory(string directoryPath, bool recursive = false)
        {
            // 检查文件夹是否存在
            if (!Directory.Exists(directoryPath))
            {
                throw new DirectoryNotFoundException("文件夹不存在");
            }

            // 删除文件夹
            Directory.Delete(directoryPath, recursive);
        }

        // 重命名文件夹
        public static void RenameDirectory(string directoryPath, string newDirectoryName)
        {
            // 获取父文件夹路径
            string parentDirectory = Directory.GetParent(directoryPath).FullName;
            // 构建新的文件夹路径
            string newDirectoryPath = Path.Combine(parentDirectory, newDirectoryName);

            // 检查文件夹是否存在
            if (!Directory.Exists(directoryPath))
            {
                throw new DirectoryNotFoundException("文件夹不存在");
            }

            // 检查新文件夹名是否已存在
            if (Directory.Exists(newDirectoryPath))
            {
                throw new IOException("新文件夹名已存在");
            }

            // 重命名文件夹
            Directory.Move(directoryPath, newDirectoryPath);
        }

        // 移动文件夹
        public static void MoveDirectory(string sourceDirectoryPath, string destinationDirectoryPath)
        {
            // 检查源文件夹是否存在
            if (!Directory.Exists(sourceDirectoryPath))
            {
                throw new DirectoryNotFoundException("源文件夹不存在");
            }

            // 检查目标文件夹是否已存在
            if (Directory.Exists(destinationDirectoryPath))
            {
                throw new IOException("目标文件夹已存在");
            }

            // 移动文件夹
            Directory.Move(sourceDirectoryPath, destinationDirectoryPath);
        }

        // 复制文件夹
        public static void CopyDirectory(string sourceDirectoryPath, string destinationDirectoryPath)
        {
            // 检查源文件夹是否存在
            if (!Directory.Exists(sourceDirectoryPath))
            {
                throw new DirectoryNotFoundException("源文件夹不存在");
            }

            // 检查目标文件夹是否已存在
            if (Directory.Exists(destinationDirectoryPath))
            {
                throw new IOException("目标文件夹已存在");
            }

            // 创建目标文件夹
            Directory.CreateDirectory(destinationDirectoryPath);

            // 获取源文件夹中的所有文件
            foreach (var file in Directory.GetFiles(sourceDirectoryPath, "*", SearchOption.AllDirectories))
            {
                string destinationFile = file.Replace(sourceDirectoryPath, destinationDirectoryPath);
                string destinationDir = Path.GetDirectoryName(destinationFile);

                // 创建目标文件夹
                if (!Directory.Exists(destinationDir))
                {
                    Directory.CreateDirectory(destinationDir);
                }

                // 复制文件
                File.Copy(file, destinationFile);
            }
        }
    }
}
